// 题目描述
// 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ，返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。

// 如果行和列以相同的顺序包含相同的元素（即相等的数组），则认为二者是相等的。

// 示例 1：

// 输入：grid = [[3,2,1],[1,7,6],[2,7,7]]
// 输出：1
// 解释：存在一对相等行列对：
// - (第 2 行，第 1 列)：[2,7,7]

// 示例 2：

// 输入：grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
// 输出：3
// 解释：存在三对相等行列对：
// - (第 0 行，第 0 列)：[3,1,2,2]
// - (第 2 行, 第 2 列)：[2,4,2,2]
// - (第 3 行, 第 2 列)：[2,4,2,2]

// 自己的答案（看了官方答案后发现原来的做法缺少了计算原数组中每个项的个数，思路差不多）：
/**
 * @param {number[][]} grid
 * @return {number}
 */
var equalPairs = function (grid) {
    const cnt = {};
    let columnArr = [] // 由列组成的数组
    let res = 0;

    for (const row of grid) {
        const rowStr = row.toString();
        cnt[rowStr] = (cnt[rowStr] || 0) + 1;
    }
    
    for (let i = 0; i < grid[0].length; i++) { // 行
        let temp = []
        for (let j = 0; j < grid.length; j++) { // 列
            temp.push(grid[j][i])
        }
        columnArr.push(temp)
    }
    console.log(columnArr)

    for (let i = 0; i < columnArr.length; i++) { // 行
        if (cnt[columnArr[i]]) {
            res += cnt[columnArr[i]];
        }
    }

    return res
};
console.log(equalPairs([
    [3, 1, 2, 2],
    [1, 4, 4, 5],
    [2, 4, 2, 2],
    [2, 4, 2, 2]
]))

// Gpt答案（时间复杂度和空间复杂度太高不用看，主要看官方题解）：
function equalRowAndColumnPairs(grid) {
    const n = grid.length;
    const rowSums = [];
    const colSums = new Array(n).fill(0).map(() => []);

    // 计算每一行的和（数组）
    for (let i = 0; i < n; i++) {
        rowSums[i] = grid[i].slice();
    }

    // 计算每一列的和（数组）
    for (let j = 0; j < n; j++) {
        for (let i = 0; i < n; i++) {
            colSums[j][i] = (colSums[j][i] || 0) + grid[i][j];
        }
    }

    let count = 0;

    // 比较每一行和每一列
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if (arraysEqual(rowSums[i], colSums[j])) {
                count++;
            }
        }
    }

    return count;
}

// 辅助函数：比较两个数组是否相等
function arraysEqual(arr1, arr2) {
    if (arr1.length !== arr2.length) return false;
    for (let i = 0; i < arr1.length; i++) {
        if (arr1[i] !== arr2[i]) return false;
    }
    return true;
}

// 示例测试
const grid1 = [[3, 2, 1], [1, 7, 6], [2, 7, 7]];
console.log(equalRowAndColumnPairs(grid1)); // 输出: 1

const grid2 = [[3, 1, 2, 2], [1, 4, 4, 5], [2, 4, 2, 2], [2, 4, 2, 2]];
console.log(equalRowAndColumnPairs(grid2)); // 输出: 3

// 官方题解：
var equalPairs = function(grid) {
    const n = grid.length;
    const cnt = {};

    for (const row of grid) {
        const rowStr = row.toString();
        cnt[rowStr] = (cnt[rowStr] || 0) + 1;
    }

    let res = 0;
    for (let j = 0; j < n; j++) {
        const arr = [];
        for (let i = 0; i < n; i++) {
            arr.push(grid[i][j]);
        }
        const arrStr = arr.toString();
        if (cnt[arrStr]) {
            res += cnt[arrStr];
        }
    }

    return res;
};
